<?php

namespace App\Libs\verificationcode;
use Illuminate\Support\Facades\Cache;
//生成验证码
class GrapVerificate
{

  public $pic = '';
  public $str = '';
  public function __construct()
  {
  }
  function verify($captchaId='',$num = 5,$type = 3,$width = 100,$height = 40,$time=300){
    // 1. 准备画布
    $image = imagecreatetruecolor($width, $height); // 设置验证码图片大小的函数
    // 2. 生成颜色（背景填充颜色，字体颜色）
    imagefilledrectangle($image, 0, 0, $width, $height, $this->lightColor($image));// 画一矩形并填充
    // 3. 你需要什么样的字符
    $string = '';
    switch($type){
        case 1:
            $str = '0123456789';
            $string = substr(str_shuffle($str), 0 ,$num);
            break;
        case 2:
            $arr = range('a','z');
            shuffle($arr);
            $tmp = array_slice($arr,0,5);
            $string = join('', $tmp);
            break;
        case 3:
            // 0-9 a-z A-Z
            $str = '0123456789abcdefghizklmnopqrstuvwxyzABCDEFGHIZKLMNOPQRSTUVWXYZ'; // 也可取出类似的0il
            $string = substr(str_shuffle($str),0,$num);
            break;
    }
    $this->str = $string;
    // 4. 开始写字
    $fontsize = $width * 0.75; // 字大小
    for($i = 0;$i < $num;$i++){
        $x = floor($width / $num) * $i + 4;
        $y = mt_rand(10, $height - 20);
        imagechar($image, $fontsize, $x, $y, $string[$i], $this->deepColor($image));// 水平低画一个字符
    }
    // 5. 干扰线（点）
    for($i = 0;$i < $num;$i++){
        imagearc($image, mt_rand(10, $width), mt_rand(10, $height), mt_rand(10, $width), mt_rand(10, $height), mt_rand(0, 10), mt_rand(0, 270), $this->deepColor($image));// 画椭圆弧
    }
    for($i = 0;$i < 50;$i++){
        imagesetpixel($image, mt_rand(10, $width), mt_rand(10, $height), $this->deepColor($image));// 画一个单一像素
    }
    // 6. 指定输出的类型
    header('Content-type:image/png;');
    // 7. 准备输出图片
    imagepng($image);
    // 8. 销毁
    imagedestroy($image); // 结束图形函数 销毁$image
    $captchaId = 'captcha_'.$captchaId;
    Cache::put($captchaId,$string,!empty($time)?$time:5);
    return $string;
  }
  // 浅色
  function lightColor($image){
      return imagecolorallocate($image, mt_rand(130, 255),mt_rand(130, 255), mt_rand(130, 255)); // 为一幅图像分配颜色
  }
  // 深色
  function deepColor($image){
      return imagecolorallocate($image, mt_rand(0, 120),mt_rand(0, 120), mt_rand(0, 120));
  }
  function isVerify($captchaId,$value){
    $captcha = 'captcha_'.$captchaId;
    if(!Cache::has($captcha))
    {
        return false;
    }
    $key = Cache::get($captcha);
    $value = strtolower($value);
    $key = strtolower($key);
    if($value == $key){
        Cache::forget($captcha);
        return true;
    }
    return false;
  }

}
